/*  --------------------------- (C) COPYRIGHT 2020 Fortiortech ShenZhen -----------------------------
    File Name      : UART.c
    Author         : Fortiortech  Appliction Team
    Version        : V1.0
    Date           : 2020-04-11
    Description    : This file contains .C file function used for Motor Control.
    ----------------------------------------------------------------------------------------------------
                                       All Rights Reserved
    ------------------------------------------------------------------------------------------------- */
#include "Myproject.h"

LIN_Struc Lin = {0};

/*配置串口2的rx管脚为外部中断*/
void MODE_IO(void)
{

    Lin.Time4s = 4000;  /*总线4s无数据时候触发 总线休眠*/
    Lin.Sleep_flag = 0; /*总线休眠标志位*/

    ClrBit(UT2_BAUD, UART2IEN); /*关闭 UART2 中断进入io模式*/
    ClrBit(P0_OE, PIN1);        /*输入模式*/
    ClrBit(P0_PU, PIN1);        /*上拉禁止*/
    /*设置EXT0==0001：配置 P0.1 为外部中断 0 接口*/
    ClrBit(LVSR, EXT0CFG2); /* P01 接口外部中断 0 配置*/
    ClrBit(LVSR, EXT0CFG1);
    SetBit(LVSR, EXT0CFG0);
    /*配置为下降沿触发中断*/
    IT01 = 1; /*电平变化触发中断*/
    IT00 = 0;
    /*配置中断优先级*/
    PX00 = 1;
    PX01 = 1;
    /*清除外部中断*/
    IF0 = 0;
    /*配置中断优先级*/
    EX0 = 0; /* 使能外部中断0*/
}

void MODE_UART(void)
{

    EX0 = 0;                 /* 关闭外部中断0  进入串口模式*/
    SetBit(PH_SEL, UART2EN); /* P3[6]as UART2_RXD; P3[7]as UART2_TXD*/
    ClrBit(UT2_CR, UT2MOD1); /* 00-->单线制8bit        01-->8bit uart(波特率可设置)*/
    SetBit(UT2_CR, UT2MOD0); /* 10-->单线制9bit        11-->9bit uart(波特率可设置)*/
    ClrBit(UT2_CR, UT2SM2);  /* 0-->单机通讯          1-->多机通讯；*/
    SetBit(UT2_CR, UT2REN);  /* 0-->不允许串行输入 1-->允许串行输入，软件清0;*/
    ClrBit(UT2_CR, UT2TB8);  /*模式2/3下数据发送第9位，在多机通信中，可用于判断当前数据帧的数据是地址还是数据，TB8=0为数据，TB8=1为地址*/
    ClrBit(UT2_CR, UT2RB8);  /*模式2/3下数据接收第9位，若SM2=0,作为停止位*/
    PSPI_UT21 = 1;           /*中断优先级时最低*/
    PSPI_UT20 = 0;

    UT2_BAUD = 0x4D; /*波特率可设置 = 24000000/(16/(1+ UT_BAUD[BAUD_SEL]))/(UT_BAUD+1)*/
    /* 9B-->9600 0x000c-->115200 0x0005-->256000  4D-->19200*/
    ClrBit(UT2_BAUD, BAUD2_SEL); /*倍频使能0-->Disable  1-->Enable*/
    SetBit(UT2_BAUD, UART2CH);   /* UART2 端口功能转移使能0：P36->RXD P37->TXD 1:P01->RXD P00->TXD*/
    SetBit(UT2_BAUD, UART2IEN);  /* UART2 中断使能0-->Disable  1-->Enable*/
}

/*  ----------------------------------------------------------------------------------------------*/
/*  Function Name  : put_char
    /*  Description    : put_char
    /*  Date           : 2020-09-06
    /*  Parameter      : c: [输入/出]
    /*  ----------------------------------------------------------------------------------------------*/
void put_char(uint8 c)
{
    UT2_DR = c;
    while (ReadBit(UT2_CR, UT2TI) == 0)
        ;
    ClrBit(UT2_CR, UT2TI); /*清除发送*/
}

void LIN_Send(uint8 *str, uint8 Check, uint8 Leng)
{
    uint8 i = 0;

    for (i = 0; i < Leng; i++)
    {
        put_char(str[i]);
    }
    put_char(Check);
}
/*  ----------------------------------------------------------------------------------------------*/
/*  Function Name  : LinCheck 计算数据的校验和
    /*  Description    : 输入CheckMode:校验模式 ;
                             PID:PDI;
                             Leng:数据长度;
                             str：计算数组;
    /*  Date           : 2020-09-06
    /*  Parameter      : 返回校验和
    /*  ----------------------------------------------------------------------------------------------*/
uint8 LinCheck(uint8 CheckMode, uint8 PID, uint8 Leng, uint8 *str)
{
    uint16 CheckDATA = 0;
    uint8 i = 0;
    if (CheckMode) /*增强型校验*/
    {
        CheckDATA = PID;
    }

    for (i = 0; i < Leng; i++)
    {
        CheckDATA = CheckDATA + str[i];
        if (CheckDATA > 0xff) /*校验方法*/
        {
            CheckDATA = CheckDATA - 0xff;
        }
    }
    CheckDATA = 0xff - CheckDATA;
    return (uint8)CheckDATA;
}
/*---------------------------------------------------------------------------*/
/*  Name     :   void TIM3_Init(void)
    /* Input    :   NO
    /* Output   :   NO
    /* Description: Timer3的初始化，只用于计数器使用  。5.28ms触发定时器
/*---------------------------------------------------------------------------*/
void TIM3_Init(void)
{
    ClrBit(PH_SEL, T3SEL); /* Timer3端口不使能*/

    /*-------------------------------------------------------------------------------------------------
    Tim3_CR0
    [7:5]  T4PSC2 T4PSC1 T4PSC0  定时器分频配置0
                    //000-->24M     001-->12M       010-->6M    011-->3M
                    //100-->1.5M    101-->750K      110-->375K  111-->187.5K
    [4]    T4OCM            		 输入 timer 模式：周期沿选择
    [3]    T4IRE    						 输入 timer 模式：脉宽检测中断使能
    [2]    RSV
    [1]    T4OPM          			 输入 timer 模式：PWM 周期检测或计数器上溢事件
    [0]    T4MOD            		 0：输入 timer 模式   1：输出模式
    -------------------------------------------------------------------------------------------------*/
    ClrBit(TIM3_CR0, T3PSC2); /*计数器时钟分频选择 011-->3M   0。333us*/
    SetBit(TIM3_CR0, T3PSC1); /* 000-->24M		001-->12M		010-->6M	011-->3M*/
    SetBit(TIM3_CR0, T3PSC0); /* 100-->1.5M	101-->750K		110-->375K	111-->187.5K*/

    SetBit(TIM3_CR0, T3OCM); /*输入timer模式，周期沿选择   0-->高电平脉宽   1-->低电平脉宽*/
    ClrBit(TIM3_CR0, T3IRE); /*比较匹配中断/脉宽检测中断   0-->Disable     1-->Enable*/
    ClrBit(TIM3_CR0, T3OPM); /*输入模式：PWM周期检测或计数器上溢事件  0-->计数器不停止		1-->单次模式(清除 TxCEN)*/
    ClrBit(TIM3_CR0, T3MOD); /* 0-->Timer模式       1-->输出模式*/

    ClrBit(TIM3_CR1, T3IR); /* 清除标志位 比较中断*/
    ClrBit(TIM3_CR1, T3IP); /* 清除标志位*/
    ClrBit(TIM3_CR1, T3IF); /* 清除标志位 溢出中断*/

    ClrBit(TIM3_CR1, T3IPE); /*输入Timer PWM周期检测中断使能 0-->Disable  1-->Enable*/
    SetBit(TIM3_CR1, T3IFE); /*计数器上溢中断使能 0-->Disable  1-->Enable*/
    ClrBit(TIM3_CR1, T3NM1); /*输入噪声脉宽选择*/
    ClrBit(TIM3_CR1, T3NM0); /* 00-->不滤波	01-->4cycles    10-->8cycles  11-->16cycles*/
    SetBit(TIM3_CR1, T3EN);  /* TIM3使能    0-->Disable  1-->Enable*/

    /*注意溢出中断的时间要小于调度表的时间  当前设定时间10ms*/
    TIM3__ARR = 30000; /*  IR比较中断 重装载寄存器*/
    TIM3__DR = 30000;  /*设定10ms中断  IF溢出中断 没有使能*/
    TIM3__CNTR = 1;

    PTIM31 = 1;
    PTIM30 = 0;
}

